<?php
class baseDossierActions extends sfActions{
	
  /**
   * Sets an alternate template for this sfAction.
   *
   * See 'Naming Conventions' in the 'Symfony View' documentation.
   *
   * @param string $name    Template name
   * @param string $module  The module (current if null)
   */
  public function setTemplate($name, $module = null)
  {
    if (sfConfig::get('sf_logging_enabled'))
    {
      $this->dispatcher->notify(new sfEvent($this, 'application.log', array(sprintf('Change template to "%s/%s"', null === $module ? 'CURRENT' : $module, $name))));
    }

    if (null !== $module)
    {
      $filename = sfConfig::get('sf_app_dir').'/modules/'.$module.'/templates/'.$name;
    }
    if(!file_exists($filename)){
    	$filename = sfConfig::get('sf_plugins_dir').DIRECTORY_SEPARATOR.'sfColibriPlugin'.DIRECTORY_SEPARATOR.'modules'.DIRECTORY_SEPARATOR.$module.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR.$name;
    }

    sfConfig::set('symfony.view.'.$this->getModuleName().'_'.$this->getActionName().'_template', $filename);
  }	
	
  public function executeIndex(sfWebRequest $request){
  	
  	$this->personne = $this->getUser()->getUserProfile();
	$i18N = sfContext::getInstance()->getI18N();
	$user = $this->getUser();

	$this->view = $request->getParameter('view');
	
	$viewOriginal = $this->getUser()->getAttribute('viewOriginal');
	if($viewOriginal!=$this->view){
		$this->getUser()->getAttributeHolder()->remove('activeFilters');
		$this->getUser()->setAttribute('viewOriginal',$this->view);
	}

	$this->objDef = new objectDef('dossier');
	$this->config = ambnoyFuncs::getViewConfig($this->view, $this->personne, $this->objDef);
	
	$this->actualPage = $request->getParameter('page',1);
	$this->order = $request->getParameter('order', $this->config['orderColumn']);

	$this->getUser()->setAttribute('lastviewinfo', array('actualPage' => $this->actualPage, 'order' => $this->order, 'view' => $this->view));
  }
  
  public function executeShowDossier(sfWebRequest $request){
 		$this->dossier = Doctrine::getTable('dossier')->find($request->getParameter('dossier'));
 		$this->personne = $this->getUser()->getUserProfile();
 		/*Get all this parameters in order to go back to the same view I was.*/
 		$this->view = $request->getParameter('view');
		$this->objDef = new objectDef('dossier');
		$this->config = ambnoyFuncs::getViewConfig($this->view, $this->personne, $this->objDef);
		$this->actualPage = $request->getParameter('page',1);
		$this->order = $request->getParameter('order', $this->config['orderColumn']);
 		
 		
 		$this->detailObjDef = new objectDef($this->dossier->formulairedef->xtable);
  }

  
  
  public function executeCreateDossier(sfWebRequest $request){
  	$idFormulaireDef = $request->getParameter('formulaireDef');
  	$idDossier = $request->getParameter('idDossier', 0);
  	$idPersonne = $request->getParameter('demandeur', false);
  	if($idPersonne){
  		$this->personne = Doctrine::getTable('personne')->find($idPersonne);
  	}else{
  		$this->personne = $this->getUser()->getUserProfile();
  	}
  	if($idDossier){
  		$dossier = Doctrine::getTable('dossier')->find($idDossier);
  		$this->formulaireDef = $dossier->formulairedef;
  	}else{
  		$this->formulaireDef = Doctrine::getTable('formulairedef')->find($idFormulaireDef);	
  	}
  	$this->className = $this->formulaireDef->xtable;
  	$formClass = $this->className . 'Form';
  	if($idDossier){
  		$this->form = new $formClass($dossier->getDetail());
  	}else{
  		$this->form = new $formClass;
  		
  	}
  	
  	$this->objDef = new objectDef($this->formulaireDef->xtable);

  	$this->module = $this->getModuleName();
	$this->itemsForms = array();
  	if($this->objDef->hasAttach){
		$this->formAttach = new attachmentForm();
		$this->getUser()->setAttribute('filesToUpload', array());
	}else{
		$this->formAttach = null;
	}  	
  
  	
  }
	/*
	 * Fonction executé pour processer une action du workflow.
	 * L'action est declenché par le valideur depuis le tableau "mes demandes a traiter" ou depuis une demande.
	 * La fonction peut s'appliquer à une demande ou à un groupe des demandes.
	 * 	 * 
	 * Cette action est appelée quand un utilisateur (Valideur) veut exécuter une action (ex : Valider ou Refuser une demande). Au démarrage, elle crée un form de classe « processActionForm » 
	 * L’action reçoit en paramètre le numéro de la demande (demande) et l’id de l’état dans lequel la demande doit rester après l’exécution de l’action (actionCode). A partir de ces deux paramètres l’application utilise la fonction getActionDef de la classe erdfFuncs pour trouver la définition de l’action qui correspond au changement vers l’état cible.
	 * 
	 * Ensuite, l’application crée un « lienetatsdemandes » et rajoute le nouvel état. Dans la définition de l’action, l’application trouve les champs fermedemande, recalculeDelai, commentaireObligatoire et champsModifier :
	 *   •	fermedemande : Si vrai, l’action marque la demande comme close (champ ferme = true). 
	 *   •	recalculeDelai : Si vrai, l’action recalcule le délai de la demande avec la fonction getNextOpenDay  de la classe erdfFuncs.
	 *   •	commentaireObligatoire : Si vrai, l’action utilise la fonction setCommentaireObligatoire du formulaire pour rajouter l’obligation de remplir le commentaire.
	 *   •	champsModifier : Une liste de champs à modifier par l’utilisateur. Cette liste des champs est formée par des noms de champs de la table « demandes » séparées par une « , ». Pour chacun d’entre eux, l’action appelle la fonction « addWidget » pour rajouter un widget pour le champ à modifier.
	 * 
	 * Ensuite, elle fait la recherche du nouveau valideur via la fonction getValideurForLocalisation de la classe erdfFuncs. Si elle trouve plus d’un valideur pour la prochaine étape (action), elle rajoute un widget avec les options de valideurs pour que la personne qui est en train d’exécuter l’action, fasse le choix (fonction setValideurs du formulaire). 
	 * Si l’id du rôle du valideur de l’étape suivante est « 0 », le valideur de l’étape suivante est le demandeur. 
	 * Puis, l’action établit (set) les variables de session « f_etat, f_udateFields, f_sansMails, f_demande ». Ces variables seront reprises par l’action suivante pour enregistrer les changements.
	 * Finalement, le « template » Process Action, montre le formulaire à l’utilisateur pour qu’il puisse remplir les données.
	 * 
	 * Si l'utilisateur est en train d'exécuter une action "avec dérogation", un widget avec les choix du type de dérogation est ajouté au formulaire. Les types de dérogation disponibles dépendent de :
	 * •	La catégorie de la demande
	 * •	Le valideur qui exécute l'action.
	 * •	Un paramètre de l'action (addDerogation=true)

	 * 
	 * @param sfWebRequest $request
	 * 
	 * @param string reaffecter (true|false) indique si il s'agit d'une action ou simplement d'une reaffectation.
	 * @param string reaffecter (true|false) indique s'il faut creer une derogation au moment d'executer l'action
	 * @param int demande 		l'id de la demande sur laquelle il faut executer l'action
	 * @param int groupe 		l'id du groupe sur lequelle il faut executer l'action. Il n'existe pas s'il s'agit seulement d'une demande
	 * @param int actionCode    l'id de l'action du workflow à executer. 
	 * 
	 * 
	 * */
	
	public function executeProcessAction($request){	 	
		$this->dossier= Doctrine::getTable('dossier')->find($request->getParameter('dossier'));
		/*I get the action definition.*/
		$this->actionWf = Doctrine::getTable('actionwf')->find($request->getParameter('actionCode'));
		
		/*Get all this parameters in order to go back to the same view I was.*/
		$lastviewinfo = $this->getUser()->getAttribute('lastviewinfo');
		
		$this->personne = $this->getUser()->getUserProfile();
 		$this->view = $request->getParameter('view', $lastviewinfo['view']);
		$this->objDef = new objectDef('dossier');
		$this->config = ambnoyFuncs::getViewConfig($this->view, $this->personne, $this->objDef);
		$this->actualPage = $request->getParameter('page',$lastviewinfo['actualPage']);
		$this->order = $request->getParameter('order', $lastviewinfo['order']);
		$this->detailObjDef = new objectDef($this->dossier->formulairedef->xtable);
		$this->moduleRef = $request->getParameter('moduleRef', 'dossiers');
		$this->actionRef = $request->getParameter('actionRef');
		$i18N = sfContext::getInstance()->getI18N();
		
		$form = new processActionForm;
	  	$personne = $this->getUser()->getUserProfile();
		$this->commentaire = '';
		$etat= $this->dossier->getLinkCurrentState();
		
		if(!$request->isMethod('post')){
			if(!$personne->estActeur($etat->acteur_id)){
				$this->redirect(sfConfig::get('sf_error_404_module').'/forbidden');
			}
		}
		if($this->actionWf->etatorigine_id != $etat->etat_id){
			$this->getUser()->setFlash('Erreur', "<h1>L'état a été modifié par " . $etat->personne->name . ". L'état actuel de la demande est : " . $etat->etat->description) .'</h1>';
			$this->redirect(sfConfig::get('sf_error_404_module').'/forbidden');
		};
 		
		$form->setWidgetsFromAction($this->actionWf);
		if($this->actionWf->ferme){
			$this->commentaire = $this->commentaire . $i18N->__('This Action will close the process');		 
		}
		
		/*Get de next acteur*/
		
		/*TODO Esta funcion esta buscando por el rol de la accion actual. Hay que buscar por el role de la accion siguente
		 * dado que el objetivo es mostrar al usuario quien va a continuar con el dossier*/
		
		$roleNextActeur = $this->dossier->getRoleActeur($this->actionWf->etatdestine) ;
		if($roleNextActeur){
			$codeApplicant = sfConfig::get('app_colibri_code_role_applicant', '00');
			if($roleNextActeur->code == $codeApplicant){
				$acteurs = array($this->dossier->demandeur);
			}else{
				$acteurs = $this->dossier->getActeurForLocalisation($roleNextActeur);
			}
			//La variable $roleNextValideur_id est utilise par la fonction js changeValideur .
		    $this->roleNextActeur_id = $roleNextActeur->id;
					
			if(count($acteurs)>1){
		      	$this->showActeurs = true;
			    $form->setActeurs($acteurs, $this->actionWf->role->description);
				/*TODO
			    $valideurAnt = $demande->getActeur();
				$form->setDefault('valideur', $valideurAnt->id);
				*/
			     /*
			      * TODO
			      * Get dernier lien-etat et si c'est un prestataire, metre prestataire par default et le nom du prestataire!
			      * */
			    /*
				 $dernierLien = $demande->getLienEtatActuel();
				 if($dernierLien->prestataire){
				 	$form->setDefault('nom_prestataire', $dernierLien->nom_prestataire);
				  	$form->setDefault('prestataire_id', $dernierLien->prestataire_id);
				  }*/
			 }elseif(count($acteurs)==1){
		      	//La variable $roleNextValideur_id est utilise par la fonction js changeValideur .
			    $this->showActeurs=false;
			  	$this->acteur = $acteurs[0];
			  	
			  	$form->setDefault('acteurclass', get_class($acteurs[0]));
			  	$form->setDefault('acteur', $acteurs[0]->id);
			  	if(get_class($acteurs[0])=='personne'){
			  		$this->nomActeur =  $acteurs[0]->prenom . ' ' . $acteurs[0]->nom;
			  	}else{
			  		$this->nomActeur =  $acteurs[0]->getNameActeur();
			  	}
			 }
		}else{
			$this->showActeurs=false;
		}
		
		
		// $form->addFieldsToModify($this->actionWf, $this->dossier);
      	
 		
		$dossierList = array($this->dossier); //variable pour gerer des traitemens en groupe dans le futur

		$lockMng = new lockManager();
		//Get locks for each dossier on the group
		foreach($dossierList as $dossier){
			$lock = $lockMng->lockObject($dossier);
			if(!$lock){
				$lockInfo = $lockMng->whosLocking($dossier);
				$this->getUser()->setFlash('Erreur', 'Le dossier numéro ' . $lockInfo['object_id'] . ' est en cours d\'utilisation par l\'utilisateur ' . $lockInfo['username'] . '<br /> Veuillez essayer ultérieurement');
				return $this->redirect('error_msg/lockedResource');
			}
		}
		
		
      	$this->form = $form;
		$this->addAttach = $this->actionWf->addattach;
      	if($this->addAttach){
  			$this->formAttach = new attachmentForm();
  		}
  		
  		$this->setTemplate('processAction', 'dossiers');
   			
 	}

 	public function executeSubmitAction(sfWebRequest $request){	 	
		$this->dossier= Doctrine::getTable('dossier')->find($request->getParameterHolder()->get('dossier'));
		/*Get all this parameters in order to go back to the same view I was.*/
		$this->personne = $this->getUser()->getUserProfile();
 		$this->view = $request->getParameter('view');
		$this->objDef = new objectDef('dossier');
		$this->config = ambnoyFuncs::getViewConfig($this->view, $this->personne, $this->objDef);
		$this->actualPage = $request->getParameter('page',1);
		$this->order = $request->getParameter('order', $this->config['orderColumn']);
		$this->detailObjDef = new objectDef($this->dossier->formulairedef->xtable);
		$this->actionRef = $request->getParameter('actionRef');
		$i18N = sfContext::getInstance()->getI18N();
		
 		//Verifier si l'utilisateur à encore les locks sur la /les dossiers/s
		$lockMng = new lockManager();

 		$lockInfo = $lockMng->whosLocking($this->dossier);
 		if(!is_array($lockInfo)){
 			$this->getUser()->setFlash('Erreur', 'Le dossier ' . $this->dossier->id . ' à été modifié par une autre utilisateur. <br /> Veuillez essayer ultérieurement');
			return $this->redirect('error_msg/lockedResource');
 		}else{
	 		if( !( $lockInfo['user_id'] == current($this->getUser()->getUserProfile()->identifier()) and $lockInfo['client_ip'] == $lockMng->getClientIP())){
	 			$this->getUser()->setFlash('Erreur', 'Le dossier numéro ' . $lockInfo['object_id'] . ' est en cours d\'utilisation par l\'utilisateur ' . $lockInfo['username'] . '(' . $lockInfo['client_ip'] .') <br /> Veuillez essayer ultérieurement');
				return $this->redirect('error_msg/lockedResource');
	 		};	
 		}
		
		$action = Doctrine::getTable('actionwf')->find($request->getParameterHolder()->get('action_id', 0));
 		$comm=$request->getParameterHolder()->get('commentaire');
		$hideConfirmation=$request->getParameterHolder()->get('hideConfirmation');
		$acteurclass = $request->getParameterHolder()->get('acteurclass');
		if($acteurclass){
			$acteur = Doctrine::getTable($acteurclass)->find($request->getParameterHolder()->get('acteur'));
		}
		$ancien_acteur = $this->dossier->getLinkCurrentState()->acteur;
		$etat = $this->dossier->createLienEtat($this->personne, $action->etatdestine, $action, $ancien_acteur);
		$etat->commentaire=$comm;
		if($acteurclass){
			if($acteurclass=='personne'){
				$etat->acteurnominatif = $acteur;
				$etat->acteur = NULL;
			}else{
				$etat->acteur = $acteur;
			}
		}
		$etat->save();
 		/*upload des attachs*/
		$user =  sfContext::getInstance()->getUser();
		$files = $user->getAttribute('filesToUpload');
		if(isset($files))
		{
			foreach($files as $key => $attach)
			{
				$attach->owner_id = $this->dossier->id;
				$attach->ownerclass = get_class($this->dossier);
				$attach->upload_file();
				$attach->save();
			}
		}
		$user->getAttributeHolder()->remove($attributeName, 'filesToUpload');
		ambnoyFuncs::createNotifications($this->dossier, false);
		if($action->ferme){
			//ermer($save=false,$onlyTech=false,$noTech=false)
			$this->dossier->fermer(true,false);
		}elseif($action->fermetechnique){
			$this->dossier->fermer(true,true);
		}
		$lockMng->releaseObject($this->dossier);
		$backparams = 'dossier='.$this->dossier->id.'&view='.$this->view.'&order='.$this->order.'&page='.$this->actualPage;
		$this->redirect($this->getModuleName() . '/' . $this->actionRef .'?' . $backparams);
 	}
}